R es un entorno y un lenguaje de programación estadística.
Es una de las herramientas más usadas en el análisis de datos. Es de código libre, su uso es gratuito y dispone de una comunidad muy activa que contribuye al desarrollo de herramientas y funciones adicionales (más de 10.000 paquetes) y a la resolución de preguntas a través de la red.
https://www.r-project.org/about.html https://www.rdocumentation.org/ https://stackoverflow.com/questions/tagged/r
R
Se puede instalar desde https://cran.r-project.org/.
RStudio
Es una interfaz gráfica (o IDE) para la realización de cálculos y la programación en R.
Se instala desde https://www.rstudio.com/, versión RStudio Desktop (Open Source License).
R puede usarse desde la consola introduciendo directamente las instrucciones correspondientes.
2 + 3 ## [1] 5
8 ^ 10## [1] 1073741824
log(100) # Logaritmo neperiano## [1] 4.60517
# indica que lo que sigue es un comentario
Un script en R es un conjunto de instrucciones escritas en un archivo de texto, de forma que estás puedan almacenarse y ejecutarse con posterioridad. Se suelen almacenar con la extensión .R.
Un editor muy recomendado para la creación, ejecución y depuración de estos scripts es RStudio.
? "mean"?? "anova"En RStudio, se puede seleccionar y pulsar F1 para buscar en la ayuda
TRUE o FALSEa <- 2
a## [1] 2
class(a)## [1] "numeric"
b <- 13.6788956789
b## [1] 13.6789
class(b)## [1] "numeric"
print(b, digits = 10)## [1] 13.67889568
Operadores más comunes para datos de tipo numeric
| Suma | + |
| Resta | - |
| Producto | * |
| División | / |
| Potencia | ^ o ** |
| Módulo (residuo) | %% |
| División entera | %/% |
| Comparaciones | == > < >= <= != |
a+b## [1] 15.6789
a-b## [1] -11.6789
a*b## [1] 27.35779
a^b## [1] 13114.69
a/b## [1] 0.1462106
Permite almacenar números enteros. Es el tipo de datos usado para contadores e índices.
n <- as.integer(340000)
class(n)## [1] "integer"
n <- 2L
class(n)## [1] "integer"
Permite almacenar cadenas de texto de longitud indeterminada.
Los literales se indican entre comillas dobles (o simples).
a <- "aaa"
b <- "bbb"
paste(a, b, "hola", sep = ", ") ## [1] "aaa, bbb, hola"
Operadores más comunes para datos de tipo character
| Comparaciones | == > < >= <= != |
Almacena valores que son verdadero (TRUE) o falso (FALSE).
Es el resultado de una comparación.
3 == 2## [1] FALSE
b <- 3 != 2
b## [1] TRUE
Operadores más comunes para datos de tipo logical
| Intersección lógica | & |
| Unión lógica | | |
| Negación lógica | ! |
| Comparaciones | == != |
Por ejemplo…
a <- TRUE
b <- F
a & b # Operador AND## [1] FALSE
a | b # Operador OR## [1] TRUE
!b # Operador NOT## [1] TRUE
Las funciones de conversión de tipos en R se indican como as. seguido del tipo de dato de destino.
as.character(2)## [1] "2"
as.numeric(TRUE)## [1] 1
Para saber si una información o variable es de un tipo determinado puede usarse is. seguido del tipo de dato a comprobar.
R incorpora algunas constantes preestablecidas como
pi## [1] 3.141593
Inf
NaN
NA
NULLTambién existen funciones para evaluar si un dato corresponde a una de estas constantes.
is.na(3)## [1] FALSE
is.null(NULL)## [1] TRUE
is.infinite(-Inf)## [1] TRUE
a <- c(2, 3, 4)
str(a)## num [1:3] 2 3 4
a[2]## [1] 3
Las operaciones se aplican a vectores y devuelven vectores
a + a ## [1] 4 6 8
a > 2.5## [1] FALSE TRUE TRUE
Atención al reciclaje de datos…
a <- c(2, 3, 4)
b <- c(10, 20)
a * b## Warning in a * b: longer object length is not a multiple of shorter object
## length
## [1] 20 60 40
Las funciones en R suelen ser vectoriales
a <- c(2, 3, 4)
abs(sin(a))## [1] 0.9092974 0.1411200 0.7568025
exp(a)## [1] 7.389056 20.085537 54.598150
length(a)## [1] 3
sum(a)## [1] 9
mean(a)## [1] 3
También sd, max, min…
Puede determinarse si un valor está presente en un vector con el operador %in%.
a <- c(2, 3, 4)
3 %in% a## [1] TRUE
c(2,5,3,4) %in% a## [1] TRUE FALSE TRUE TRUE
Existen estructuras especificas para crear vectores secuencia.
1:10## [1] 1 2 3 4 5 6 7 8 9 10
seq(1, 10, by = 2)## [1] 1 3 5 7 9
seq(1, 3, length.out = 5) ## [1] 1.0 1.5 2.0 2.5 3.0
Los vectores se ordenan usando las funciones sort y order.
a <- c(8, 2, 5, 3)
sort(a)## [1] 2 3 5 8
a[order(a)]## [1] 2 3 5 8
a[order(a,decreasing = T)]## [1] 8 5 3 2
Un factor es un vector de cadenas indexado. Normalmente se crea a partir del vector de cadenas de texto.
a <- c("hola", "adeu","hola", "adeu", "adeu", "bye")
b <- as.factor(a)
as.character(b)## [1] "hola" "adeu" "hola" "adeu" "adeu" "bye"
as.numeric(b)## [1] 3 1 3 1 1 2
str(b)## Factor w/ 3 levels "adeu","bye","hola": 3 1 3 1 1 2
La función factor permite la codificación o recodificación manual de un vector.
a <- factor(c(3, 1, 3, 1, 1, 2), labels = c("adeu", "bye", "hola"))
a## [1] hola adeu hola adeu adeu bye
## Levels: adeu bye hola
levels(a)## [1] "adeu" "bye" "hola"
dfA <- data.frame(int = 1:10,
let = sample(letters, 10, replace = TRUE),
ran = rnorm(10))
dfA## int let ran
## 1 1 v 0.29960808
## 2 2 z 0.83836620
## 3 3 e 0.07921012
## 4 4 x 0.24917894
## 5 5 p -1.38040089
## 6 6 y -0.71291163
## 7 7 y -0.13931512
## 8 8 g -0.38800423
## 9 9 e -0.28194017
## 10 10 f 0.02638425
dim(dfA) # Dimensión## [1] 10 3
nrow(dfA) # Número de columnas## [1] 10
ncol(dfA) # Número de filas## [1] 3
str(dfA)## 'data.frame': 10 obs. of 3 variables:
## $ int: int 1 2 3 4 5 6 7 8 9 10
## $ let: Factor w/ 8 levels "e","f","g","p",..: 5 8 1 6 4 7 7 3 1 2
## $ ran: num 0.2996 0.8384 0.0792 0.2492 -1.3804 ...
head(dfA, 3) # Primeros datos, 6 por defecto## int let ran
## 1 1 v 0.29960808
## 2 2 z 0.83836620
## 3 3 e 0.07921012
tail(dfA, 2) # Últimos valores## int let ran
## 9 9 e -0.28194017
## 10 10 f 0.02638425
Para acceder a los datos almacenados en el data frame se usan índices. Las variables de data frame también pueden extraerse usando su nombre.
dfA[2,3]## [1] 0.8383662
dfA[,1]## [1] 1 2 3 4 5 6 7 8 9 10
dfA$let## [1] v z e x p y y g e f
## Levels: e f g p v x y z
Veremos más formas de acceder y usar los datos de una tabla de datos más adelante.
a <- list(2, "2", FALSE)
b <- list(3, "hola", c(2, 3, 4))a## [[1]]
## [1] 2
##
## [[2]]
## [1] "2"
##
## [[3]]
## [1] FALSE
b## [[1]]
## [1] 3
##
## [[2]]
## [1] "hola"
##
## [[3]]
## [1] 2 3 4
length(a)## [1] 3
a[[3]]## [1] FALSE
b[[3]][1]## [1] 2
str(b)## List of 3
## $ : num 3
## $ : chr "hola"
## $ : num [1:3] 2 3 4
notes <- c("Aprovat", "Insuficient", "Notable", "Insuficient",
"Notable", "Excel·lent", "Aprovat")
notes <- factor(notes,
levels = c("Insuficient", "Aprovat",
"Notable", "Excel·lent"),
ordered = TRUE)
str(notes)## Ord.factor w/ 4 levels "Insuficient"<..: 2 1 3 1 3 4 2
levels(notes)## [1] "Insuficient" "Aprovat" "Notable" "Excel·lent"
a <- matrix(c(2, 4, -3, 5), ncol = 2)
a## [,1] [,2]
## [1,] 2 -3
## [2,] 4 5
a[2,2]## [1] 5
a * a # Producto posición por posición## [,1] [,2]
## [1,] 4 9
## [2,] 16 25
a %*% a # Producto matricial## [,1] [,2]
## [1,] -8 -21
## [2,] 28 13
t(a) # Transposición## [,1] [,2]
## [1,] 2 4
## [2,] -3 5
R tiene muchos paquetes para resolver problemas específicos. Para usar un paquete adicional este debe instalarse y cargarse en memoria.
installed.packages()[,1] # Lista los paquetes instalados
(.packages()) # Lista los paquetes en memoriaDos recursos importantes para buscar y identificar paquetes relevantes son https://www.rdocumentation.org/ https://cran.rstudio.com/web/views/
Para instalar un paquete, por ejemplo “nycflights13”
install.packages("nycflights13")Para cargar un paquete en memoria, se usa
library("nycflights13")En RStudio la gestión de paquetes también puede hacerse desde la interfaz del programa
En un script y para garantizar la disponibilidad de un paquete
if(!require("nycflights13")) {
install.packages("nycflights13")
library("nycflights13")
}Para acceder a la documentación de un paquete
help(package="nycflights13")Algunos paquetes tienen información adicional a la que se puede acceder con las funciones vignette() y demo().
La principales funciones de los gráficos en el análisis de datos son
Veremos dos paradigmas distintos para la creación de gráficos en R.
base.ggplot2base RLos gráficos en base R se construyen a partir de datos en vectores y usando funciones específicas en función del gráfico a realizar.
Para ejemplificar algunas de estas funciones, usaremos el conjunto de datos mtcars, que forma de los paquetes básicos de R.
str(mtcars)## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
head(mtcars, 10)## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Veremos como crear
base R – gráfico de dispersiónplot(mtcars$disp,mtcars$hp)base R – histogramahist(mtcars$disp)Añadiendo una curva de densidad…
hist(mtcars$disp,breaks=20,freq=FALSE)
lines(density(mtcars$disp))base R – diagrama de barrasbarplot(table(as.factor(mtcars$cyl)))base R – diagrama de cajaboxplot(mtcars$disp)
points(mean(mtcars$disp))La gramática de gráficos es una aproximación teórica al estudio de los componentes de un gráfico. De acuerdo con este análisis, un gráfico se puede construir mediante la especificación de un conjunto de capas y componentes que definen los datos, la asociación de los mismos a aspectos del gráfico, la especificación de la relación entre los valores de las variables de los datos con las del gráfico, la estructura geométrica del gráfico…
Wilkinson, L. (2006). The grammar of graphics. Springer Science & Business Media.
ggplot2ggplot2 es un paquete de R que implementa de la gramática de gráficos.
Wickham, H. (2010). A layered grammar of graphics. Journal of Computational and Graphical Statistics, 19(1), 3-28.
Referencias:
ggplot2 forma parte del paquete tidyverse (aunque también puede instalarse y cargarse autónomamente).
if(!require("tidyverse")) {
install.packages("tidyverse")
library("tidyverse")
}ggplot2 – capas y elementos del gráficoEn ggplot2 cada elemento gráfico que representa un conjunto de datos constituye una capa. Una o más capas constituyen un gráfico.
Cada capa queda definida mediante la especificación de sus elementos. Los principales son
En ggplot2, los gráficos constituyen un objeto de R y se construyen de forma aditiva.
Por ejemplo,
grafico <- ggplot(data = anscombe,
mapping = aes(x = x1, y = y1)) # Datos y mapeado estético
grafico <- grafico + geom_point() # Geometría
graficoggplot2 – datosEn ggplot2, el elemento data (datos) se introduce como primer argumento de la función ggplot. Debe corresponder a una tabla de datos o un tipo de datos convertible a tabla de datos.
grafico <- ggplot(data = anscombe,ggplot2 – mapeado estéticoEl mapping (mapeado estético) corresponde al establecimiento de relaciones entre variables de los datos y variables del gráfico. Es el segundo argumento de la función ggploty debe crearse con al función de apoyo aes.
mapping = aes(x = x1, y = y1))Para variables cuantitativas, los mapeados más comunes corresponden a
x, y…sizecolor, fillPara variable cualitativas, los mapeados más frecuentes son
x, y…color, fillshapeggplot2 – geometríasLas geometrías (geom_) indican la forma que debe tener el gráfico, es decir, cómo se articulan las variables del gráfico. Se añaden al gráfico sumándose al objeto creado por ggplot.
grafico <- grafico + geom_point()Son geometrías de uso común
geom_pointgeom_line, geom_vline, geom_hlinegeom_bargeom_histogramgeom_boxplotUn resumen de las geometrías y su relación con las variables del gráfico que reconoce cada una de ellas figura en https://github.com/rstudio/cheatsheets/raw/master/data-visualization-2.1.pdf.
ggplot2Veremos cómo crear en ggplot2 los gráficos más habituales, añadiendo algunas consideraciones para aquellos casos donde los gráficos realizados con base tienen prestaciones insuficientes.
De forma general, los gráficos en ggplot2 se construyen a partir de tablas de datos (data frames), de los cuales se seleccionan las variables a representar.
Usaremos 1000 datos del conjunto de datos diamonds para crear los distintos ejemplos.
diaM <- diamonds[sample(1:nrow(diamonds),1000),]
str(diaM)## Classes 'tbl_df', 'tbl' and 'data.frame': 1000 obs. of 10 variables:
## $ carat : num 0.33 0.7 0.73 1.23 0.54 0.9 0.32 0.57 0.35 0.3 ...
## $ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 3 4 3 5 4 5 4 5 5 ...
## $ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 1 2 3 5 4 2 2 2 4 ...
## $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 6 2 2 5 4 4 3 3 3 8 ...
## $ depth : num 61.2 63.3 61.8 59.3 61.9 60 61.9 58.9 60.9 61.6 ...
## $ table : num 56 57 58 59 56 59 55 59 55 53 ...
## $ price : int 814 2354 2278 10609 1359 4424 559 1406 614 863 ...
## $ x : num 4.44 5.64 5.76 6.98 5.24 6.3 4.4 5.41 4.53 4.32 ...
## $ y : num 4.48 5.6 5.71 7.01 5.26 6.23 4.43 5.35 4.57 4.35 ...
## $ z : num 2.73 3.56 3.54 4.15 3.25 3.76 2.73 3.17 2.77 2.67 ...
ggplot2 – gráfico de dispersiónggplot(diaM, aes(x=carat,y=price)) + geom_point()Añadiendo una tercera variable (cut) y modificando algunos aspectos de formato…
ggplot(diaM, aes(x=carat,y=price,color=cut)) +
geom_point(alpha=.8,shape=21,size=3)Añadiendo líneas de tendencia…
ggplot(diaM, aes(x=carat,y=price,color=cut)) +
geom_point(alpha=.8,shape=21,size=3) +
geom_smooth(method="lm",se=FALSE)ggplot2 – histogramaggplot(diaM, aes(x=price)) + geom_histogram(binwidth=1000)Y en función del corte…
ggplot(diaM, aes(x=price,fill=cut)) +
geom_histogram(position='dodge',binwidth=1000)En frecuencias relativas (por grupo)…
ggplot(diaM, aes(x=price,y=..density..,fill=cut)) +
geom_histogram(position='dodge',binwidth=1000)Quizás funcione mejor un gráfico de densidades…
ggplot(diaM, aes(x=price,fill=cut)) +
geom_density(alpha=.3)ggplot2 – diagrama de barrasggplot(diaM, aes(x=clarity)) + geom_bar()En función de la claridad…
ggplot(diaM, aes(x=clarity, fill=cut)) + geom_bar()Para comparar entre frecuencias absolutas, funcionan mejor las barras separadas.
ggplot(diaM, aes(x=clarity, fill=cut)) + geom_bar(position="dodge")Para comparar entre frecuencias relativas acumuladas, son mejores las barras apiladas en frecuencia relativa (para cada clase).
ggplot(diaM, aes(x=clarity, fill=cut)) + geom_bar(position="fill")Los diagramas de barras también pueden crearse a partir de tablas de datos agrupados. En este caso, debe indicarse qué variable es la y e incluir stat="identity" en el geom_bar.
ggplot2 – diagrama de cajaggplot(diaM, aes(x=1, y=price)) + geom_boxplot()NOTA: Para el geom_boxplot se requieren dos variables. Si no hay variable independiente se puede incluir x=1.
Y en función del corte…
ggplot(diaM, aes(x=cut, y=price)) + geom_boxplot()El gráfico se puede mejorar mostrando todos los puntos, con una posición aleatorizada.
ggplot(diaM, aes(x=cut, y=price)) +
geom_boxplot(outlier.shape = NA) +
geom_jitter(shape = 21, alpha=.5,height=0,width=.2)O incluyendo un violin plot y un punto para la media…
medias <- diaM %>% group_by(cut) %>%
summarise(price=mean(price))
ggplot(diaM, aes(x=cut, y=price)) +
geom_violin() +
geom_boxplot(outlier.shape = NA, width = 0.1) +
geom_point(data=medias,shape=3)ggplot2 – elementos adicionalesAdemás de los elementos ya presentados (datos, mapeado estético y geometrías), otros elementos de ggplot2 permiten controlar aspectos adicionales del gráfico, por ejemplo
scale_...: controlan los aspectos relativos a la presentación de las variables del gráfico,coord_...: establecen el sistema de coordenadas usado en la geometría,labs: establece los títulos del gráfico,theme, theme_...: controlan la part del gráfico que no corresponde a datos (non-data ink), yfacet_: permite la creació de secuencia de gráficos en función de una o dos variablesUn ejemplo para terminar…
ggplot(diaM, aes(x=carat, y = price, shape = cut, col = clarity)) +
geom_point(alpha=.6) +
scale_x_continuous(breaks=1:3) +
scale_y_continuous(trans="log10") +
scale_color_brewer(palette="Spectral")+
facet_grid(cut ~ clarity) +
theme_bw() +
theme(legend.position = "none",text = element_text(size=10))La estadística, como parte de la matemática que se ocupa de la recolección, análisis e interpretación de datos, tiene dos funciones principales
En este repaso de la estadística básica, usaremos (de nuevo) el conjunto de datos mtcars.
str(mtcars)## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
head(mtcars, 10)## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
A menudo, el primer interés que tendremos es el de describir un conjunto de datos correspondientes a una sola variable. Esta es la situación con la que empezaremos.
¿Cómo se describe un conjunto de datos univariante?
Normalmente se consideran los siguientes aspectos
Tamaño de la muestra o número de datos
length(mtcars$disp)## [1] 32
n <- sum(!is.na(mtcars$disp))
n## [1] 32
Frecuencias absolutas y relativas
Para una variable cuantitativa (numeric)…
frec_abs <- table(cut(mtcars$disp,
breaks=c(0,100,200,300,400,500,Inf)))
frec_abs##
## (0,100] (100,200] (200,300] (300,400] (400,500] (500,Inf]
## 5 11 5 8 3 0
frec_rel <- frec_abs / n
frec_rel##
## (0,100] (100,200] (200,300] (300,400] (400,500] (500,Inf]
## 0.15625 0.34375 0.15625 0.25000 0.09375 0.00000
Cuantiles
quantile(mtcars$disp,.1)## 10%
## 80.61
quantile(mtcars$disp,1:4*.2)## 20% 40% 60% 80%
## 120.14 160.00 275.80 350.80
mean(mtcars$disp)## [1] 230.7219
median(mtcars$disp)## [1] 196.3
var(mtcars$disp) # el denominador es n-1## [1] 15360.8
sd(mtcars$disp)## [1] 123.9387
range(mtcars$disp)## [1] 71.1 472.0
diff(range(mtcars$disp))## [1] 400.9
IQR(mtcars$disp)## [1] 205.175
mad(mtcars$disp) # mean absolute deviation## [1] 140.4764
lmin <- quantile(mtcars$disp,.25) - 1.5*IQR(mtcars$disp)
lmax <- quantile(mtcars$disp,.75) + 1.5*IQR(mtcars$disp)
mtcars$disp[mtcars$disp > lmax | mtcars$disp < lmin]## numeric(0)
lmin <- quantile(mtcars$qsec,.25) - 1.5*IQR(mtcars$qsec)
lmax <- quantile(mtcars$qsec,.75) + 1.5*IQR(mtcars$qsec)
mtcars$qsec[mtcars$qsec > lmax | mtcars$qsec < lmin]## [1] 22.9
Gráficamente, son útiles para describir un conjunto de datos
boxplot(mtcars$qsec)
hist(mtcars$qsec)barplot(table(factor(mtcars$cyl)))Para el estudio y descripción de la relación entre dos variables, las técnicas más habituales incluyen
Es el concepto equivalente a las tablas de frecuencias en el caso univariante.
Para variables cualitativas…
table(factor(mtcars$am),factor(mtcars$cyl))##
## 4 6 8
## 0 3 4 12
## 1 8 3 2
Para variables cuantitativas…
table(cut(mtcars$disp,breaks = seq(0,500,by=100)),
cut(mtcars$qsec,breaks = seq(13,25,by=3)))##
## (13,16] (16,19] (19,22] (22,25]
## (0,100] 0 3 2 0
## (100,200] 1 7 2 1
## (200,300] 0 3 2 0
## (300,400] 4 4 0 0
## (400,500] 0 3 0 0
Producto-momento de Pearson
cor(mtcars$disp,mtcars$qsec)## [1] -0.4336979
Coeficiente de correlación de Spearman
cor(mtcars$disp,mtcars$qsec, method = "spearman")## [1] -0.4597818
plot(mtcars$disp,mtcars$qsec)La distribución de probabilidad de un número aleatorio corresponde a la abstracción teórica de la densidad de los datos de una conjunto. Representa la densidad que se obtendría cunado se generasen infinitos números aleatorios de acuerdos a un mismo procedimiento o experimento.
Un gran número de distribuciones experimentales tienen modelos teóricos con los que se relacionan. Los tres más comunes son la distribución normal (para datos de variables cuantitativas continuas), la distribución uniforme (para cualquier tipo de datos) y la distribución binomial (para el número de veces que se produce un suceso de una determinada probabilidad).
En R, todas las distribuiciones comparten el mismo sistema de funciones
r<dist>: genera aleatorios deacuerdo con una distribución de probabilidadd<dist>: devuelve la densidad de probablidad para un valor de variableq<dist>: devuelve el valor de la variable tal que la probablidadp<dist>: devuelve la probablidad que un valor sea inferior o igual a xPor ejemplo, para la distribución normal estándar…
rnorm(10)## [1] -0.43540370 -0.51658429 0.08029873 -0.80013265 -0.30665362
## [6] -1.20757490 0.10710983 1.69543243 -0.16602575 -2.84271477
dnorm(0)## [1] 0.3989423
qnorm(.95)## [1] 1.644854
pnorm(1.64)## [1] 0.9494974
df <- data.frame(x = rnorm(1000, mean = 3, sd = 1))
dfT <-data.frame(x = seq(0,6,length.out=101),
y = dnorm(seq(0,6,length.out=101),mean=3,sd=1))
ggplot(df, aes(x = x, y=..density..)) +
geom_histogram(binwidth = .1,fill="#dddddd",col="black") +
geom_density() +
geom_line(data=dfT,aes(x=x,y=y),col="red")+
theme_bw()pnorm(5,mean = 3,sd = 1)## [1] 0.9772499
qnorm(.98,mean = 3,sd = 1)## [1] 5.053749
df <- data.frame(x = runif(1000, min = 10, max = 20))
dfT <-data.frame(x = seq(10,20,length.out=101),
y = dunif(seq(10,20,length.out=101), min=10, max=20))
ggplot(df, aes(x = x, y=..density..)) +
geom_histogram(binwidth = .5,fill="#dddddd",col="black") +
geom_density() +
geom_line(data=dfT,aes(x=x,y=y),col="red")+
theme_bw()punif(12, min=10, max=20)## [1] 0.2
qunif(.90, min=10, max=20)## [1] 19
df <- data.frame(x = rbinom(100,5,prob=0.5))
df <- df %>% group_by(x) %>%
summarise(y = n()/nrow(df))
dfT <- data.frame(x = 0:5,
y = dbinom(0:5,size=5,prob=0.5))
dfJ <- rbind(cbind(teo=FALSE,df),
cbind(teo=TRUE,dfT))
ggplot(dfJ,aes(x=x,y=y,fill=teo)) +
geom_bar(position="dodge", stat="identity",
col="black") +
theme_bw()pbinom(2,5,prob=0.5)## [1] 0.5
qbinom(.5,5,.5)## [1] 2
R incorpora otras muchas distribuciones de probabilidad que pueden consultarse en la página correspondiente de la ayuda.
? "Distributions"